﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using ForrajeriaBCL;
using ForrajeriaDB;
using System.Data;
namespace ForrajeriaFRONT
{
    public partial class Factura : System.Web.UI.Page
    {
        private FacturaBCL factBCL = new FacturaBCL();
        private FacturaMO factMO = new FacturaMO();
        private DetalleFacturaMO detalle;
        private DataTable detFac = null;
        
        protected void Page_Load(object sender, EventArgs e)
        {
            lblMensaje.Visible = false;
            if (!Page.IsPostBack)
            {
                ((Label)this.Master.FindControl("lblTitulo")).Text = "Factura";
               
                AnimalBCL objAnimal = new AnimalBCL();
                List<AnimalMO> listaAnimal = objAnimal.GetAll();
                ddlAnimal.Items.Add(new ListItem("---Seleccione---", "0"));
                foreach (AnimalMO aux in listaAnimal)
                {
                    ddlAnimal.Items.Add(new ListItem(aux.Nombre, aux.CodigoAnimal.ToString()));
                }
                
                MarcaBCL objMarca = new MarcaBCL();
                List<MarcaMO> listaMarca = objMarca.GetAll();
                ddlMarca.Items.Add(new ListItem("---Seleccione---", "0"));
                foreach (MarcaMO aux in listaMarca)
                {
                    ddlMarca.Items.Add(new ListItem(aux.Nombre, aux.CodigoMarca.ToString()));
                }

                EdadesBCL objEdades = new EdadesBCL();
                List<EdadesMO> listaEdades = objEdades.GetAll();
                ddlEdad.Items.Add(new ListItem("---Seleccione---", "0"));
                foreach (EdadesMO aux in listaEdades)
                {
                    ddlEdad.Items.Add(new ListItem(aux.Descripcion.ToString(), aux.CodigoEdad.ToString()));
                }
                
                detFac = new DataTable();
                detFac.Columns.Add(new DataColumn("codigoForraje", typeof(int)));
                detFac.Columns.Add(new DataColumn("nombreForraje", typeof(string)));
                detFac.Columns.Add(new DataColumn("descripcion", typeof(string)));
                detFac.Columns.Add(new DataColumn("peso", typeof(string)));
                detFac.Columns.Add(new DataColumn("cantidad", typeof(string)));
                detFac.Columns.Add(new DataColumn("precioKilo", typeof(string)));
                detFac.Columns.Add(new DataColumn("precio", typeof(string)));
                
                ViewState["CurrentTable"] = detFac;
                
            }
        }
        protected void cargaPanelCliente()
        {
            panelCliente.Visible = true;
            panelForraje.Visible = false;
            panelForraje.Visible = false;
        }

        protected void btnBuscarCliente_Click(object sender, EventArgs e)
        {
            ClienteBCL objBC = new ClienteBCL();
            string apellido = "";
            string nombre = "";
            int documento = 0;


            if (!string.IsNullOrWhiteSpace(txtApellidoCliente.Text))
            { apellido = txtApellidoCliente.Text; }

            if (!string.IsNullOrWhiteSpace(txtNombreCliente.Text))
            { nombre = txtNombreCliente.Text; }

            if (!string.IsNullOrWhiteSpace(txtDocumentoCliente.Text))
            { documento = Int32.Parse(txtDocumentoCliente.Text); }

            gvCliente.DataSource = null;
            gvCliente.DataSource = objBC.buscarClientes(nombre, apellido, documento);
            gvCliente.DataBind();
            gvCliente.Visible = true;
            gvCliente.SelectedIndex = -1;
        }

        

        protected void gvCliente_SelectedIndexChanging(object sender, GridViewSelectEventArgs e)
        {
            int ind = e.NewSelectedIndex;
            if (ind != -1)
            {
                txtNroCliente.Text = gvCliente.DataKeys[ind].Values["Codigo"].ToString();
                txtNombreCliente.Text = gvCliente.Rows[ind].Cells[0].Text;
                txtApellidoCliente.Text = gvCliente.Rows[ind].Cells[1].Text;
                txtDocumentoCliente.Text = gvCliente.Rows[ind].Cells[2].Text;

                gvCliente.Visible = false;
            }
        }

        protected void gvPedido_SelectedIndexChanging(object sender, GridViewSelectEventArgs e)
        {
            int ind = e.NewSelectedIndex;
            if (ind != -1)
            {
                txtNroPedido.Text = gvPedido.Rows[ind].Cells[0].Text;
                gvPedido.Visible = false;
                panelForraje.Visible = false;
                //cargar det Pedido en det Factura
                DataTable table = factBCL.DetallePedidoCliente2(int.Parse(txtNroPedido.Text));
                
                
                gv_detalles.DataSource = null;
                gv_detalles.DataSource = table;
                gv_detalles.DataBind();
                lblDetalle.Visible = true;
                actualizarTotal(table);
            }
        }

        protected void btnBuscarPedido_Click(object sender, EventArgs e)
        {
            
            
            PedidoClienteBCL pedidos= new PedidoClienteBCL();

            List<PedidoClienteMO> pedidoClienteMO = pedidos.getByCliente(int.Parse(txtNroCliente.Text), "B");

            gvPedido.DataSource = pedidoClienteMO;
            gvPedido.DataBind();
            gvPedido.Visible=true;
        
        }
        
        protected void btnBuscarForraje_Click(object sender, EventArgs e)
        {
            string nombre = null;
            string edad = null;
            string marca = null;
            string animal = null;

            ForrajeBCL forrajeBC = new ForrajeBCL();

            if (!String.IsNullOrWhiteSpace(txtForraje.Text))
            { nombre = txtForraje.Text; }

            if (ddlEdad.SelectedValue != "0")
            {
                edad = ddlEdad.SelectedValue;
            }

            if (ddlMarca.SelectedValue != "0")
            {
                marca = ddlMarca.SelectedValue;
            }
            if (ddlAnimal.SelectedValue != "0")
            {
                animal = ddlAnimal.SelectedValue;
            }

            CleanControl(this.panelForraje.Controls);

            gvForraje.DataSource = null;

            DataTable dt = forrajeBC.buscarConFiltros(nombre, edad, marca, animal);
            gvForraje.DataSource = dt;
            gvForraje.DataBind();
            gvForraje.Visible = true;
            gvForraje.SelectedIndex = -1;
        }

        protected void gvForraje_SelectedIndexChanging(object sender, GridViewSelectEventArgs e)
        {
            int ind = e.NewSelectedIndex;
            if (ind != -1)
            {
                txtForraje.Text = gvForraje.Rows[ind].Cells[0].Text;
                ddlMarca.SelectedValue = gvForraje.DataKeys[ind].Values["codigoMarca"].ToString();
                ddlEdad.SelectedValue = gvForraje.DataKeys[ind].Values["codigoEdad"].ToString();
                ddlAnimal.SelectedValue = gvForraje.DataKeys[ind].Values["codigoAnimal"].ToString();
                txtDescripcion.Text = gvForraje.DataKeys[ind].Values["descripcionForraje"].ToString();
                txtPrecioXkilo.Text = gvForraje.Rows[ind].Cells[5].Text; 
                txtPeso.Text=gvForraje.Rows[ind].Cells[4].Text;
                lblCodigoForraje.Text = gvForraje.DataKeys[ind].Values["codigoForraje"].ToString();
                gvForraje.Visible = false;

                
            }
        }
        
        protected void gv_detalles_RowDeleting(object sender, GridViewDeleteEventArgs e)
        {
            int ind = e.RowIndex;
            DataTable dt = (DataTable)ViewState["CurrentTable"];
            dt.Rows.RemoveAt(ind);
            gv_detalles.DataSource = dt;
            gv_detalles.DataBind();
            ViewState["CurrentTable"] = dt;
            actualizarTotal(dt);
            
        }

        protected void btnDetalle_Click(object sender, EventArgs e)
        {
            
            DataRow dr = null;
            DataTable dt = (DataTable)ViewState["CurrentTable"];
            
            dr = dt.NewRow();
            dr["codigoForraje"] = int.Parse(lblCodigoForraje.Text);
            dr["nombreForraje"] = txtForraje.Text;
            dr["descripcion"] = txtDescripcion.Text;
            dr["peso"] = txtPeso.Text;
            dr["cantidad"] = txtCantidad.Text;
            dr["precioKilo"] = txtPrecioXkilo.Text;
            dr["precio"] = (double.Parse(txtCantidad.Text) * double.Parse(txtPeso.Text) * double.Parse(txtPrecioXkilo.Text)).ToString();
            
            dt.Rows.Add(dr);
            ViewState["CurrentTable"]=dt;
            gv_detalles.DataSource = dt;
            gv_detalles.DataBind();
            gv_detalles.Visible = true;

            
            CleanControl(this.panelForraje.Controls);
            lblCodigoForraje.Text = "";

            actualizarTotal(dt);
        }
        protected void actualizarTotal(DataTable dt)
        {
            double total = 0.00;
            //DataTable dt = (DataTable)ViewState["CurrentTable"];
            foreach (DataRow aux in dt.Rows)
            {
                total += double.Parse(aux["precio"].ToString());

            }

            ViewState["Total"] = total;
            lblTotal.Text = "Total: " + String.Format("{0:0.00}", total); 
            
            lblTotal.Visible = true;
            if (total == 0)
            {
                lblTotal.Visible = false;
                lblTotal.Text = "";
            }
        }
        protected void btnGuardar_Click(object sender, EventArgs e)
        {
            if (guardarFactura() == true)
            {
                lblMensaje.ForeColor = System.Drawing.Color.Blue;
                lblMensaje.Text = "Guardado Correctamente";
                lblMensaje.Visible = true;
            }
            else
            {
                lblMensaje.ForeColor = System.Drawing.Color.Red;
                lblMensaje.Text = "Error de Escritura en Base de Datos";
                lblMensaje.Visible = true;
            }
            CleanControl(this.Controls);
            gv_detalles.Visible = false;
            lblTotal.Visible = false;
            gvPedido.Visible = false;
            panelForraje.Visible = true;
        }

        protected bool guardarFactura()
        {
            factBCL = new FacturaBCL();
            try
            {
                UsuarioBCL objUser = new UsuarioBCL();

                //************************* CREACION OBJETO FACTURA **********************************************************

                factMO = new FacturaMO();
                factMO.CodigoCliente = int.Parse(txtNroCliente.Text);

                UsuarioMO user = objUser.ComprobarDisponibilidad(Context.User.Identity.Name);

                if (user.CodigoEmpleado != null)
                    factMO.CodigoEmpleado = user.CodigoEmpleado;

                factMO.Fecha = DateTime.Today;
                if (txtNroPedido.Text != "")
                    factMO.NroPedido = int.Parse(txtNroPedido.Text);


                factMO.TipoFactura = ddlTipoFactura.SelectedValue;
                factMO.TotalFactura = (double)ViewState["Total"];

                //************************************************************************************************************

                //************************ CREACION DETALLE FACTURA **********************************************************

                List<DetalleFacturaMO> listaDetalleFactura = new List<DetalleFacturaMO>();
                DataTable listaDetalle = (DataTable)ViewState["CurrentTable"];

                foreach (DataRow aux in listaDetalle.Rows)
                {
                    DetalleFacturaMO detalle = new DetalleFacturaMO();


                    detalle.Precio = double.Parse(aux["precio"].ToString());
                    detalle.Forraje =int.Parse(aux["codigoForraje"].ToString());
                    detalle.Cantidad = double.Parse(aux["cantidad"].ToString());
                    detalle.Descripcion = aux["descripcion"].ToString();
                    detalle.PrecioKilo=double.Parse(aux["precioKilo"].ToString());
                    

                    listaDetalleFactura.Add(detalle);
                }

                //************************************************************************************************************
                factBCL.AdicionarFactura(factMO, listaDetalleFactura);
                return true;
            }
            catch
            {
                return false;
            }

        }

        protected void btnNuevo_Click(object sender, EventArgs e)
        {
            CleanControl(this.Controls);
            gv_detalles.DataSource = null;
            DataTable dt = (DataTable)ViewState["CurrentTable"];
            dt.Rows.Clear();
            ViewState["CurrentTable"] = dt;

        }


        public void CleanControl(ControlCollection controles)
        {
            foreach (Control control in controles)
            {
                if (control is TextBox)
                    ((TextBox)control).Text = string.Empty;
                else if (control is DropDownList)
                    ((DropDownList)control).ClearSelection();
                else if (control is RadioButtonList)
                    ((RadioButtonList)control).ClearSelection();
                else if (control is CheckBoxList)
                    ((CheckBoxList)control).ClearSelection();
                else if (control is RadioButton)
                    ((RadioButton)control).Checked = false;
                else if (control is CheckBox)
                    ((CheckBox)control).Checked = false;
                else if (control.HasControls())
                    CleanControl(control.Controls);
            }
            
        }

        protected void btnCancelar_Click(object sender, EventArgs e)
        {
            CleanControl(this.panelForraje.Controls);
        }
       
       

        
        
    }
}
/*
         * ***************************************************************************************************************** *
         *                                                                                                                   *
         *  ESTADO = 'A' ---------------------------------------------> CREADO Y PENDIENTE DE AUTORIZACION                   *
         *  ESTADO = 'B' ---------------------------------------------> AUTORIZADO                                           *
         *  ESTADO = 'C' ---------------------------------------------> FACTURADO                                            *
         *  ESTADO = 'D' ---------------------------------------------> DADO DE BAJA POR EL USUARIO                          *
         *  ESTADO = 'E' ---------------------------------------------> NO SE AUTORIZO Y LA FECHA DE HOY ES MAYOR A DESEADA  *
         *                                                                                                                   *
         * ***************************************************************************************************************** *                                                                                                      *
*/